package tag36_29_08.regExWieder;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Reg03_RegexEinigeBeispiele {

	public static void main(String[] args) {

		// Aufgabe:
		String regex = "a";
		String input = "Das ist ein Text mit a";
		// Ausgaben aus der Methode:

		// ----------------------------------
		// Gesucht wird in "Das ist ein Text"
		// mit dem regex "a".
		// Pos: 1. Gefunden: a
		// Pos: 21. Gefunden: a^

		suchen(input, regex);

		suchen("abcdabc", "ab");

		// -----------------------------------
		// Vordefinieren character classes:
		// -----------------------------------

		// Suchen nach einem beliebigen Zeichen:
		// 01234
		suchen("a.b.c", ".");

		// Suchen nach dem Punkt: Punkt f�r den regex-Compiler maskieren: \.
		suchen("a.b.c", "\\.");

		// Nach einer Ziffer suchen:
		suchen("a1b34c56", "\\d");

		// Nach allen Zeichen suchen, aber kein Ziffer:
		suchen("a1b34c56", "\\D");

		// nach whitespace character
		suchen("Ein Bsp.\t_", "\\s");

		// nach alles anderem als whitespace character
		suchen("Ein Bsp.\t_", "\\S");

		// nach word character (a...z A...Z unterstrich 0...9)
		suchen("a?c3_*�", "\\w");

		// nach NICHT word character
		suchen("a?c3_*�", "\\W");

		// -----------------------------------------
		// Selbstdefinierte character classes
		// -----------------------------------------

		suchen("ababab", "[ab]"); // nach a oder b
		suchen("Hallo", "[ab]");

		suchen("Hallo Welt", "[a-f]"); // nach a, b, c, d, e oder f

		suchen("abcdfghijklmnopqrst", "[a-cm-p]"); // nach a,b,c und c,m,o,p

		// Aufgabe:
		// regex f�r die deutschen Buchtaben definieren
		suchen("1 String mit � und � und ?", "[A-Za-z�������]");

		// Solo las letras raras de Aleman
		suchen("1 String mit � und � und ?", "[^a-z1-9A-Z?\\s]");

		System.out.println();
		System.out.println("*************ACHTUNG********************");

		// Achtung! Nur 2 Trffer: 0 und 4
		// 0123456
		suchen("abababa", "aba");

		// -------------------------
		// Qualifizierer
		// ? * +
		// -------------------------

		// 012345678
		suchen("abaacaaad", "a+"); // mindesten ein a
		// - -- ---

		suchen("abc", "a?"); // nach einem oder keinem a suchen
		suchen("", "a?"); // nach einem oder keinem a suchen

		System.out.println(isDecimalLiteral("hallo")); // false
		System.out.println(isDecimalLiteral("33")); // true
		System.out.println(isDecimalLiteral("+33")); // true
		System.out.println(isDecimalLiteral("-33")); // true
		System.out.println(isDecimalLiteral("hallo12")); // false
		System.out.println(isDecimalLiteral("ha12llo")); // false

		// 012
		suchen("abc", "a*"); // nach beliebig vielen 'a'
		suchen("abaacaaa", "a*"); // nach beliebig vielen 'a'

		// ---------------------------------------------------
		// Qualifizierer (reluctant) - nicht in der Pr�fung
		// ??, *?, +?
		// --------------------------------------------------

		// 0123456789012345
		suchen("DEFaDEFaaDEFaDEF", "a.*a"); // greedy : von dem gesamtstring
											// ausgehen: 1 Treffer
		suchen("DEFaDEFaaDEFaDEF", "a.*?a"); // reluctant: von klein ausgehen: 2
												// Treffer
		suchen("a> b (1. Jh. v. Chr.), aus Knossos</li a> (um 500 v. Chr.), Naturphilosoph aus Kroton</li a> (um 500–428 v. Chr.)</li a> (585–525 v. Chr.), vorsokratischer Naturphilosoph</li a> (120–68 v. Chr.)</li a></b> (384–322 v. Chr.)</li a></li",
				"\\(\\d+| \\d+|a></li");

	}

	static boolean isDecimalLiteral(String input) {

		String regex = "[+-]?\\d+";

		Pattern p = Pattern.compile(regex);
		Matcher m = p.matcher(input);

		if (m.find()) {
			String group = m.group();

			return input.equals(group);
		}

		return false;
	}

	static void suchen(String in, String reg) {
		System.out.println("----------------------------------------");

		System.out.println("Gesucht wird in \"" + in + "\"");
		System.out.println("mit dem regex \"" + reg + "\"");
		Pattern p = Pattern.compile(reg);
		Matcher m = p.matcher(in);

		while (m.find()) {
			System.out.println("Pos: " + m.start() + " bis: " + m.end()
					+ " - Gefunden: " + m.group());

		}

	}

}
